﻿using System;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Ink;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using AdminApplication.Controls;
using AssessmentTool.PresentationLogic.Controllers;
using AdminApplication.ServiceBridge;
using AssessmentTool.PresentationLogic;
using ModelLayer;
using AssessmentTool.Services;
using AssessmentTool.PresentationLogic.EventArguments;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using AssessmentTool.Services.DTO;
using AdminApplication.PresentationLogic.EventArguments;
using System.Linq;
using System.IO;
using AssessmentTool;
namespace AdminApplication.PresentationLogic.Controllers
{
    public class ListUsersController: AbstractController<ListUsers>
    {
       
        public ListUsersController(ListUsers element)
            : base(element)
        {

            ed.subscrive("ADMINLOGIN", load);
            ed.subscrive("LOGOUT", logout);
            ed.subscrive("USERSELECTEDVALIDATION", hideTable);
            ed.subscrive("BACKLISTAUTENTI", backLista);
            ed.subscrive("CONSOLIDATO", aggiornaUtenteValidato);
            ed.subscrive("REFRESHLIST", load);
        }
        
        public void load(EventArgs e)
        { 
            Utente u= (Utente)Session.getInstance().getValue("USER");
            UtenteAdminServiceBridge.getUserList(u,popolaLista);
            element.Visibility = Visibility.Visible;
            element.GridGestioneUtenti.Visibility = Visibility.Visible;
        }
        public void aggiornaUtenteValidato(EventArgs e)
        {
            DTOUtente utente=((UserSelectedEventArg)e).Utente;
            IEnumerable<DTOUtente> items =(IEnumerable<DTOUtente>) element.userList.ItemsSource;
            items.Where(x => x.Username == utente.Username).SingleOrDefault().Stato = "VALIDATO";
            backLista(null);
        }
        public void backLista(EventArgs e)
        {
            ed.dispatch("STOPBUSY", null);
            
            element.Visibility = Visibility.Visible;
            element.GridGestioneUtenti.Visibility = Visibility.Visible;
        }
        public void logout(EventArgs e)
        {
            element.Visibility = Visibility.Collapsed;
        }
        public void hideTable(EventArgs e)
        {
            element.GridGestioneUtenti.Visibility = Visibility.Collapsed;
        }
        public void popolaLista(object sender, getSottopostiCompletedEventArgs e)
        {
            if (e.Error != null)
            {
                ed.dispatch("STOPBUSY", new EventArgs());
                ed.dispatch("SHOWMESSAGE", new ShowMessageEventArgs() { Testo = "Errore critico nella richiesta...", Critico = true, Error = true });

            }
            else
            {
                element.userList.ItemsSource  = e.Result;
                
                ed.dispatch("STOPBUSY", new EventArgs());
            }
        }

        public void selectUtente(IEnumerable<DTOUtente> utenti)
        {
            if (utenti != null)
            {
                if (utenti.Count() == 0)
                    return;
                List<UserSelectedEventArg> list=new List<UserSelectedEventArg>();
                foreach (DTOUtente utente in utenti)
                {
                    list.Add( new UserSelectedEventArg() { Utente = utente });
                }
                ed.dispatch("USERSELECTED",  new UsersSelectedEventArg() {args=list});
            }
        }
        public void insertUtente()
        {
            ed.dispatch("SHOWINSERTUSER", null);
        }

        public void importUtente()
        {
            OpenFileDialog fd = new OpenFileDialog();
            fd.Multiselect = false;
            fd.Filter = "Excel Files|*.xls";
            byte[] output = null;
            if (fd.ShowDialog() == true)
            {
                FileStream fs = null;
                try{
                ed.dispatch("BUSY", new EventArgs());
                fs = fd.File.OpenRead();
                output = new byte[fs.Length];
                fs.Read(output, 0, output.Length);
               
                }
                catch(Exception e)
                {
                    ed.dispatch("STOPBUSY", new EventArgs());
                    ed.dispatch("SHOWMESSAGE", new ShowMessageEventArgs() { Testo = "Errore nel reperimento del file. Controllare che non sia in uso.", Critico = false, Error = true });
                    return;
                }
                finally
                {
                    if(fs!=null)
                        fs.Close();
                }
                UtenteLogged logged = (UtenteLogged)Session.getInstance().getValue("USERLOGGED");
                UtenteAdminServiceBridge.importUtentiExcel(logged.utente, output, importUtenti);
            }


        }
        public void importUtenti(object sender, importUtentiCompletedEventArgs e)
        {
            if (e.Error != null)
            {
                ed.dispatch("STOPBUSY", new EventArgs());
                ed.dispatch("SHOWMESSAGE", new ShowMessageEventArgs() { Testo = "Errore critico nella richiesta...", Critico = false, Error = true });
            }
            else
            {
                ModalWindow ew = new ModalWindow();
                FileDownloadedEventArgs arg = new FileDownloadedEventArgs() { file = e.Result };

                ew.Show("Import completato!", "Vuoi visualizzare il risultato?", ModalType.YESNO, "SAVEEXCEL", arg);
                ed.dispatch("REFRESHLIST",e);
            }
        }
        public void downloadTemplate(object sender, importUtentiCompletedEventArgs e)
        {
            if (e.Error != null)
            {
                ed.dispatch("STOPBUSY", new EventArgs());
                ed.dispatch("SHOWMESSAGE", new ShowMessageEventArgs() { Testo = "Errore critico nella richiesta...", Critico = false, Error = true });
            }
            else
            {
                ModalWindow ew = new ModalWindow();
                FileDownloadedEventArgs arg = new FileDownloadedEventArgs() { file = e.Result };
                
                ew.Show("Download completato!", "Vuoi salvare il template per l'import utenti?", ModalType.YESNO, "SAVEEXCEL", arg);
                ed.dispatch("STOPBUSY", new EventArgs());
                

            }
        }
        public void downloadTemplate()
        {

            UtenteAdminServiceBridge.importUtentiExcel(null,null, downloadTemplate);
        }
    }
}
